package com.huanf.controller;

import com.huanf.domain.MySQLToExcelVo;
import com.huanf.service.MySQLToExcelService;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;

/**
 * @author: 35238
 * 功能: 该功能跟MySQLToExcelController类易一样。区别就是这里重点在于表格样式，我们给表格添加样式
 * 时间: 2023-12-24 23:06
 */
@RestController
@Slf4j
//只改了第一行的样式，其它行还是默认样式
public class StyleToExcelController {

    @Autowired
    private MySQLToExcelService MySQLToExcelService;

    @GetMapping("/styleToExcel") //浏览器访问 http://localhost:8080/styleToExcel
    public void demo() throws IOException {

        //文件保存到哪里，还要指定文件名
        String PATH = "E:\\桌面\\Java-Ready\\conf\\Excel\\StyleToExcel.xlsx";

        //从数据库查询数据
        List<MySQLToExcelVo> productList = MySQLToExcelService.list();

        //调用下面写好的方法
        xxwrite(productList, PATH);
    }

    /**
     * 将数据库的数据写入Excel表格
     */
    public void xxwrite(List<MySQLToExcelVo> productList, String path) throws IOException{
        //创建工作簿
        XSSFWorkbook xssfWorkbook = new XSSFWorkbook();
        //创建工作表，也就是Excel表格左下角的Sheet1、Sheet2、Sheet3工作表。我们只创建一个工作表，名字要自己写参数里面
        XSSFSheet sheet = xssfWorkbook.createSheet("StyleToExcel数据");

        //创建单元格样式的对象
        XSSFCellStyle yycellStyle = xssfWorkbook.createCellStyle();
        //背景颜色(例如灰色)。IndexedColors是poi官方提供的枚举类。如果要用其它样式，就把setFillForegroundColor换掉
        yycellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
        //颜色的填充规则，例如实心颜色。CellStyle是poi官方提供的常量接口。如果要用其它样式，就把setFillPattern换掉
        yycellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);

        //创建字体样式的对象
        XSSFFont font = xssfWorkbook.createFont();
        //字体名
        font.setFontName("黑体");
        //字体颜色(例如粉色)。IndexedColors是poi官方提供的枚举类
        font.setColor(IndexedColors.PINK.getIndex());

        //把字体样式放入单元格样式里面
        yycellStyle.setFont(font);


        //第一行的数据，也就是每列的列头
        XSSFRow row = sheet.createRow(0);

        //使用样式的时候，就不能用下面的写法
        //row.createCell(0).setCellValue("姓名");
        //row.createCell(1).setCellValue("性别");
        //row.createCell(2).setCellValue("年龄");
        //row.createCell(3).setCellValue("手机号码");
        //row.createCell(4).setCellValue("邮箱");
        //row.createCell(5).setCellValue("加入时间");
        //row.createCell(6).setCellValue("地址");
        //row.createCell(7).setCellValue("状态");

        //用这种写法(把单元格样式放入我们的数据)
        XSSFCell cell0 = row.createCell(0);
        cell0.setCellValue("姓名");
        cell0.setCellStyle(yycellStyle);//把样式也要放进来
        //用这种写法
        XSSFCell cell1 = row.createCell(1);
        cell1.setCellValue("性别");
        cell1.setCellStyle(yycellStyle);//把样式也要放进来
        //用这种写法
        XSSFCell cell2 = row.createCell(2);
        cell2.setCellValue("年龄");
        cell2.setCellStyle(yycellStyle);//把样式也要放进来
        //用这种写法
        XSSFCell cell3 = row.createCell(3);
        cell3.setCellValue("手机号码");
        cell3.setCellStyle(yycellStyle);//把样式也要放进来
        //用这种写法
        XSSFCell cell4 = row.createCell(4);
        cell4.setCellValue("邮箱");
        cell4.setCellStyle(yycellStyle);//把样式也要放进来
        //用这种写法
        XSSFCell cell5 = row.createCell(5);
        cell5.setCellValue("加入时间");
        cell5.setCellStyle(yycellStyle);//把样式也要放进来
        //用这种写法
        XSSFCell cell6 = row.createCell(6);
        cell6.setCellValue("地址");
        cell6.setCellStyle(yycellStyle);//把样式也要放进来
        //用这种写法
        XSSFCell cell7 = row.createCell(7);
        cell7.setCellValue("状态");
        cell7.setCellStyle(yycellStyle);//把样式也要放进来

        //其它行的数据(样式没动，还是原来的默认样式)
        for (int i = 0; i < productList.size(); i++) {
            XSSFRow row1 = sheet.createRow(i + 1);
            row1.createCell(0).setCellValue(productList.get(i).getName());
            row1.createCell(1).setCellValue(productList.get(i).getSex());
            row1.createCell(2).setCellValue(productList.get(i).getAge());
            row1.createCell(3).setCellValue(productList.get(i).getPhone());
            row1.createCell(4).setCellValue(productList.get(i).getEmail());
            row1.createCell(5).setCellValue(productList.get(i).getEntryTime());
            row1.createCell(6).setCellValue(productList.get(i).getAddress());
            row1.createCell(7).setCellValue(productList.get(i).getStatus());
        }

        FileOutputStream fileOutputStream = new FileOutputStream(path);
        try {
            xssfWorkbook.write(fileOutputStream);
        } catch (IOException e) {
            log.error("写入Excel失败: {}",e.getMessage());;
        } finally {
            fileOutputStream.flush();
            fileOutputStream.close();
        }
    }
}
